package com.hyt.it.ogt.kq.service.gov.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hyt.it.ogt.kq.service.gov.model.dto.RoomDataPackageDTO;
import com.hyt.it.ogt.kq.service.gov.model.dto.TimeRoomInfoResultDTO;
import com.hyt.it.ogt.kq.service.gov.model.dto.arrange.CandidateSubjectDTO;
import com.hyt.it.ogt.kq.service.gov.model.dto.examiner.RoomExaminerDTO;
import com.hyt.it.ogt.kq.service.gov.model.entity.GceRoomData;
import com.hyt.it.ogt.kq.service.gov.model.entity.ObtRoomData;
import com.hyt.it.ogt.kq.service.gov.model.entity.TimeRoom;
import com.hyt.it.ogt.kq.service.gov.model.param.PageRoomPackageParam;
import com.hyt.it.ogt.kq.service.gov.model.vo.*;
import com.hyt.it.ogt.kq.service.gov.model.vo.roomdata.UnArrangeRoomTimeInfoVO;

import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * <p>
 * 批次考场表 服务类
 * </p>
 *
 * @author huangyh
 * @since 2021-03-08
 */
public interface ITimeRoomService extends IService<TimeRoom> {

    /**
     * 生成场次
     * @param taskRoomToTimeParamVO
     */
    void createTimeRoom(TaskRoomToTimeParamVO taskRoomToTimeParamVO);

    /**
     * 获取考务包信息
     * @param taskCode 考试任务编号
     * @param roomCode 考场编号
     * @return 考务包信息
     */
    List<RoomDataPackageDTO> getRoomDataPackageDTOList(String taskCode, String roomCode);

    /**
     * 获取模拟测试考务包信息
     * @param taskCode 考试任务编号
     * @param roomCode 考场编号
     * @return 模拟测试考务包信息
     */
    List<RoomDataPackageDTO> getMockRoomDataPackageDTOList(String taskCode, String roomCode);

    /**
     * 获取场次信息返回结果
     * @param taskCode 考试任务编号
     * @param placeCode 考点编号
     * @return 场次信息返回结果
     */
    List<TimeRoomInfoResultDTO> getTimeRoomInfoResultDTO(String taskCode, String placeCode);

    /**
     * 根据考试任务编号、场次编号获取场次信息
     * @param taskCode 考试任务编号
     * @param timeRoomCode 场次编号
     * @return 场次信息
     */
    TimeRoom getByTaskTimeRoomCode(String taskCode, String timeRoomCode);

    List<TimeRoom> getByTaskIdAndTimeId(String taskId, String timeId);

    /**
     * 根据考试任务id获取场次数据
     * @param taskId 考试任务id
     * @return 场次数据
     */
    List<TimeRoom> getByTaskId(String taskId);

    /**
     * 通过考试任务id删除考务包
     * @param taskId 考试任务id
     */
    void deleteRoomDataByTaskId(String taskId);

    /**
     * 获取场次信息
     * @param taskId
     * @return
     */
    List<ObtRoomData> getObtRoomDataList(String taskId);

    /**
     * 获取GCE考试系统场次信息用于生成考务包
     * @param taskId 考试任务id
     * @return GCE考试系统场次信息用于生成考务包
     */
    List<GceRoomData> getGceRoomDataList(String taskId);

    /**
     * 考务包管理列表
     * @param param
     * @return
     */
    Page<RoomPackageVO> getPageRoomPackage(PageRoomPackageParam param);

    /**
     * 查询未编排的考点ids
     * @param taskId
     * @return
     */
    List<TaskPlaceVO> selectNoArrangePlaceIds(String taskId);

    /**
     * 通过考点id获取批次考场
     * @param taskId
     * @param placeId
     * @return
     */
    List<TimeRoomVO> selectTimeRoomByPlaceId(String taskId, String placeId);

    /**
     * 查询未编排考生场次
     * @param taskId
     * @return
     */
    List<UnArrangeRoomTimeInfoVO> selectUnArrangeTimeRoomInfo(String taskId);

    /**
     * 删除任务下所有场次数据
     * @param taskId 考试任务id
     */
    void deleteAllByTaskId(String taskId);

    /**
     * 根据批次id获取批次下的考场数据
     * @param taskId 考试任务id
     * @param timeId 批次id
     * @return 批次下的考场数据
     */
    List<RoomExaminerDTO> getRoomExaminerDTO(String taskId, String timeId);

    /**
     * 获取场次数据
     * @param timeCandidateMap
     * @param taskId
     * @param roomMaxCandidateCount
     * @return
     */
    Map<String,List<TimeRoom>> getTaskTimeRoomAndCreate(Map<String,List<CandidateSubjectDTO>> timeCandidateMap,
                                                        String taskId, Integer roomMaxCandidateCount);

    /**
     * 是否允许修改场次信息
     * @param taskId 考试任务id
     * @return 是否允许修改场次信息
     */
    boolean whetherEditTimeRoom(String taskId);

    /**
     * 获取场次数据-分组
     * @param taskId
     * @return
     */
    Map<String,List<TimeRoom>> getTaskTimeRoomMap(String taskId);

    /**
     * 根据考试任务id、考场id获取场次信息
     * @param roomId 考场id
     * @return 场次信息
     */
    List<TimeRoom> listByTaskRoomId(String taskId, String roomId);

    /**
     * 根据考试任务编号、批次编号、考场编号，获取场次信息
     * @param taskCode 考试任务编号
     * @param timeCode 批次编号
     * @param roomCode 考场编号
     * @return 场次信息
     */
    Optional<TimeRoom> getByTaskTimeRoomCode(String taskCode, String timeCode, String roomCode);

    /**
     * 考试任务下是否存在指定id的场次
     * @param taskId 考试任务id
     * @param timeId 批次id
     * @param roomId 考场id
     * @return true：存在，false：不存在
     */
    boolean hasTimeRoom(String taskId, String timeId, String roomId);

    /**
     * 根据考试任务id、批次id、考场id获取场次
     * @param taskId 考试任务id
     * @param timeId 批次id
     * @param roomId 考场id
     * @return 场次
     */
    TimeRoom one(String taskId, String timeId, String roomId);

    /**
     * 是否存在场次数据
     * @param taskId
     * @return
     */
    Boolean AreTimeRoomData(String taskId);

    /**
     * 根据timeId获取考场信息
     * @param examId
     * @return
     */
    List<TimeRoomCodeVO> selectTimeRoomCodes(String examId);

    /**
     * 验证是否编排
     * @param param
     */
    void checkArrangeCandidate(TaskRoomToTimeParamVO param);

    /**
     * 批次排除考场
     * @param taskRoomToTimeParamVO
     */
    void unBindTimeRoom(TaskRoomToTimeParamVO taskRoomToTimeParamVO);

    /**
     * 获取批次考场剩余容量
     * @param taskId
     */
    Map<String,Integer> getTimeRoomMap(String taskId);

}
